/*
 * gpio.h
 *
 *  Created on: Sep 13, 2013
 *      Author: Ken Arok
 */

#include "config_board.h"

#if BOARD_2_1_USED

#ifndef GPIO_H_
#define GPIO_H_

#include <stdint.h>

typedef enum {
	RS232_SEL_GPIO = 0x10,
	PINA1_GPIO,
	PINA2_GPIO,
	RS485_SEL_GPIO,
	PINA4_GPIO,
	PINA5_GPIO,
	PINA6_GPIO,
	PINA7_GPIO,

	PINB0_GPIO = 0x20,
	RS485_RW_GPIO,
	UART1_RX_GPIO,
	UART1_TX_GPIO,
	SPI_SS_GPIO,
	SPI_MOSI_GPIO,
	SPI_MISO_GPIO,
	SPI_CLK_GPIO,

	PINC0_GPIO = 0x30,
	PINC1_GPIO,
	PINC2_GPIO,
	PINC3_GPIO,
	PINC4_GPIO,
	PINC5_GPIO,
	PINC6_GPIO,
	PINC7_GPIO,

	UART0_RX_GPIO = 0x40,
	UART0_TX_GPIO,
	MEGA128_CS_GPIO,
	PIND3_GPIO,
	PIND4_GPIO,
	PIND5_GPIO,
	PIND6_GPIO,
	PIND7_GPIO,

	PINE0_GPIO =0x50,
	BUZZER_GPIO,
	LED_HB_GPIO
}gpio_pin_t;


typedef enum {
	PORTA_GPIO = 0,
	PORTB_GPIO,
	PORTC_GPIO,
	PORTD_GPIO,
	PORTE_GPIO,
	PORTF_GPIO,
	PORTG_GPIO
}gpio_port_t;


typedef enum {
	DDRA_GPIO = 0,
	DDRB_GPIO,
	DDRC_GPIO,
	DDRD_GPIO,
	DDRE_GPIO,
	DDRF_GPIO,
	DDRG_GPIO
}gpio_ddr_t;

typedef enum {
	PINA_GPIO = 0,
	PINB_GPIO,
	PINC_GPIO,
	PIND_GPIO,
	PINE_GPIO,
	PINF_GPIO,
	PING_GPIO
}gpio_pins_t;


/** \brief Configure GPIO as input.
 *
 *  \param _gpio	GPIO pin name.
 */
extern void gpio_configure_input(gpio_pin_t _gpio);

/** \brief Configure GPIO as output.
 *
 *  \param _gpio	GPIO pin name.
 */
extern void gpio_configure_output(gpio_pin_t _gpio);

/** \brief Enable GPIO pullup Resistor.
 *
 *  \param _gpio	GPIO pin name.
 */
extern void gpio_enable_pullup(gpio_pin_t _gpio);

/** \brief Disable GPIO pullup Resistor.
 *
 *  \param _gpio	GPIO pin name.
 */
extern void gpio_disable_pullup(gpio_pin_t _gpio);

/** \brief Set GPIO pin output High.
 *
 *  \param _gpio	GPIO pin name.
 */
extern void gpio_set_pin_high(gpio_pin_t _gpio);

/** \brief Set GPIO pin output Low.
 *
 *  \param _gpio	GPIO pin name.
 */
extern void gpio_set_pin_low(gpio_pin_t _gpio);

/** \brief Write a data to GPIO port.
 *
 * \param _port	GPIO port name.
 * \param _data	Data to be written.
 */
extern void gpio_write_port(gpio_port_t _port, uint8_t _data);

/** \brief Write a data to GPIO direction.
 *
 * \param _ddr	GPIO ddr name.
 * \param _data	Data to be written.
 */
extern void gpio_write_ddr(gpio_ddr_t _ddr, uint8_t _data);

/** \brief Read a data from GPIO port.
 *
 * \param _port	GPIO port name.
 *
 * \return Data.
 */
extern uint8_t gpio_read_port(gpio_port_t _port);

/** \brief Read a data from GPIO direction.
 *
 * \param _ddr	GPIO ddr name.
 *
 * \return Data.
 */
extern uint8_t gpio_read_ddr(gpio_ddr_t _ddr);

/** \brief Read a data from GPIO pin.
 *
 * \param _pins	GPIO pin group name.
 *
 * \return Data.
 */
extern uint8_t gpio_read_pin(gpio_pins_t _pins);


#endif /* GPIO_H_ */

#endif /* BOARD_2_1_USED */
